ORM,英文叫 Object Relational Mapping,
翻譯成中文為物件關聯對映。
ORM 在網站開發結構中,是在『資料庫』和『 Model 資料容器』兩者之間,
簡單來說,它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,
因為 ORM 的一個特性為: 透過程式語言(Ruby, Java),去操作資料庫語言( SQL )。
而這也是實作了物件導向的概念,產生的一種工具模式,
所以才會有如同昨天,寫起來有點像 SQL 的 Ruby 程式碼:
users = User.where(age: 30)
那我們就來比較一下,他跟純粹使用 SQL 的優缺點吧~
ORM 的優點:
首先使用 ORM 最大的優點就是在此,
有一種常見的網路攻擊叫做 SQL 注入( SQL injection ),
就是駭客在傳輸到網站伺服器裡的資料直接寫 SQL ,
而我們網站某段 SQL 直接讀取該駭客傳來的資料並執行,
如果傳來的是正常的資料如 Email ,就會沒事,
但如果傳來的是 SQL 語句,且包含『 Delete 』這種會害死大家的詞,
那網站的資料就可能會被惡意移除。
但如果是透過 ORM 的方式,
就變成是操作程式語言,像文章開頭的例子,
where 的 age 可以改成吃變數,如 query_age,
但程式就會自動判斷,query_age 內如果是奇怪的值,
像是 “Update…” 等等之類的,就會自動擋掉。
簡單解釋一下開頭的程式語言,如果用 SQL 語句完整寫完會是:
Select * From users Where age = 30
是不是比用 ORM 版本的囉唆多了呀?
ORM 版本會簡化,幾乎都會用到的 From 和 Select 的部分,
可能讀者會想說,這又什麼好簡化的,久了不就習慣了。
但筆者得說,當程式越寫越多時,會對一些重複性極高的寫法感到疲乏,
而人在疲乏時就有可能犯一些愚蠢的錯誤,像是打錯字, 打翻杯子(?) 之類的...
ORM 就能較為避免此狀況發生。
因為 ORM 是在程式語言和資料庫之間,
因此就算我們的網站未來有資料庫轉移的問題,
也比較不會遇到需要改寫程式的狀況。
因為不同的資料庫間,SQL 語句的語法也會稍有差異,
我們來比較下面 MySQL 和 MsSQL 做兩件同樣事
// MySQL
SELECT * FROM TestTable WHERE id=12 LIMIT 10
// MsSQL
SELECT TOP 10 * FROM TestTable WHERE id=12
這兩個程式碼都要做同一件事,可是寫法會有所不同,
因此在替換資料庫時就會需要全面檢查網站的 SQL 程式碼,
或是一個 PHP 用習慣 MySQL 的工程師,
換到一家使用 PHP 配 MsSQL 的公司,
那SQL 部分就需要好好調整一番。
但是使用 ORM 就比較不會有這個狀況,
ORM 是跟開發者對程式語言的熟悉度與泛用 SQL 語法概念較有關係
講完優點,那要來提提缺點的部分:
這是所有 ORM 和程式工具的通病,
當達成了方便性,通常都會犧牲到效能的問題,
因為等於要多了『把程式語言轉譯成 SQL語言』這項工作,
不過各大程式語言的 ORM 都有持續改善,
緩慢的效能大多都是 SQL 語句設計不良,
而較少是因為使用 ORM 的關係
對於完全初學者來說,
ORM 必須融合 SQL 語言和程式語言兩個不同的概念和語法,
因此學習曲線比單寫 SQL 高了一些,
不過這算是針對初學者的問題。
對於複雜的查詢,ORM 的使用上就較為力不從心。
我們目前遇到的都算是簡單的查詢,
如果是跨好幾個表格,且要針對部分欄位做 Sum, count 等工作,
那就變成除了 ORM 的寫法外,還要額外寫入原生的 SQL 語法。
例如,SQL 有個詞 between ,可以篩選某個區間的值,
但是 Ruby 的 ORM 沒有支援,所以只能寫成這樣:
User.where(“age between ? and ?”,10,30)
在 where 內,直接寫原生的 SQL 語句,看起來很奇怪吧XD
如果有任何問題,或是指證文中的錯誤,歡迎寄信給我或留言在下面喔~